// 给定一个可包含重复数字的序列 nums ，按任意顺序 返回所有不重复的全排列。
var permuteUnique = function(nums) {
  nums.sort((a,b)=>a-b)
  let ans = []
  const dfs = (list,used) => {
      if(list.length===nums.length) {
          ans.push(list)
          return
      }
      for(var i=0;i<nums.length;i++) {
        // 如果该项和前一个相等，且前一个没使用过就跳过此次循环
        // 没使用过说明在前一项循环的时候已经经历过这项了，
        // 例如[1,2,2] 第一次循环一次得到 1 ， 下标为1的2，下标为2的2
        //第二次循环的时候 先遇到1 ，然后遇到下标为2的2，这时因为下标为2的2和下标为1的2相等，且
        // 前一个2还没使用，所以可以判断前面一次循环和这次相同，直接跳出循环即可
          if (used[i]||(i > 0 && nums[i] === nums[i - 1] && !used[i - 1])) {
              continue;
          }
          used[i] = true 
          list.push(nums[i])
          dfs([...list],used)
          used[i] = false
          list.pop()
      }
  }
  dfs([],[])
  return ans
};